#!/bin/bash
set -e
echo '支持debian12/debian13/ubuntu24'

# 日志函数
log_info() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}

log_warn() {
    echo "[WARN] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检测操作系统类型和版本
detect_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS_ID="$ID"
        OS_VERSION_ID="$VERSION_ID"
        OS_VERSION_CODENAME="$VERSION_CODENAME"

        log_info "检测到操作系统: $PRETTY_NAME"
        log_info "ID: $OS_ID, 版本: $OS_VERSION_ID, 代号: $OS_VERSION_CODENAME"

        case "$OS_ID" in
            "debian")
                case "$OS_VERSION_ID" in
                    "12") OS_TYPE="debian12" ;;
                    "13") OS_TYPE="debian13" ;;
                    *) OS_TYPE="debian_other" ;;
                esac
                ;;
            "ubuntu")
                case "$OS_VERSION_CODENAME" in
                    "noble") OS_TYPE="ubuntu24" ;;
                    *) OS_TYPE="ubuntu_other" ;;
                esac
                ;;
            *) OS_TYPE="unknown" ;;
        esac

        log_info "操作系统类型: $OS_TYPE"
    else
        log_error "无法检测操作系统信息"
        exit 1
    fi
}

enable_linger_for_users() {
    # 遍历 /home 目录下的所有子目录
    for dir in /home/*; do
        # 检查是否是目录
        if [ -d "$dir" ]; then
            # 获取目录名（用户名）
            user=$(basename "$dir")

            # 检查用户是否存在
            if id "$user" &>/dev/null; then
                # 执行 enable-linger
                log_info "为用户 $user 启用 linger..."
                loginctl enable-linger "$user"
            else
                log_warn "用户 $user 不存在，跳过..."
            fi
        fi
    done
}

# 主执行流程
main() {
    # 检测操作系统
    detect_os

    # 检查操作系统支持
    if [ "$OS_TYPE" = "unknown" ]; then
        log_error "不支持的操作系统类型"
        exit 1
    fi

    # 加载必要的内核模块
    log_info "加载 nf_tables 内核模块..."
    modprobe nf_tables

    # 根据操作系统类型安装特定的包
    install_packages_for_os

    # 启用用户 linger
    enable_linger_for_users

    # 检查并禁用docker服务（如果存在）
    if systemctl is-enabled docker.service &>/dev/null; then
        log_info "禁用 docker.service..."
        systemctl disable --now docker.service
    fi

    if systemctl is-enabled docker.socket &>/dev/null; then
        log_info "禁用 docker.socket..."
        systemctl disable --now docker.socket
    fi

    log_info "Docker rootless 环境配置完成！"
}

# 根据操作系统类型安装特定的包
install_packages_for_os() {
    log_info "根据操作系统类型安装必要的包..."

    case "$OS_TYPE" in
        "debian12")
            log_info "为 Debian 12 安装包..."
            apt install -y uidmap fuse-overlayfs dbus-user-session slirp4netns iptables
            ;;
        "debian13")
            log_info "为 Debian 13 安装包（包括兼容的 iptables 版本）..."
            # Debian 13 需要特定版本的 iptables，先检查当前版本
            current_version=$(dpkg -l libxtables12 2>/dev/null | grep '^ii' | awk '{print $3}' || echo "")
            target_version="1.8.9-2"

            if [ -n "$current_version" ] && [ "$current_version" != "$target_version" ]; then
                log_info "当前 libxtables12 版本: $current_version，需要降级到 $target_version"
                apt install -y --allow-downgrades libxtables12:amd64=$target_version
            elif [ -z "$current_version" ]; then
                log_info "安装 libxtables12 版本 $target_version"
                apt install -y libxtables12:amd64=$target_version
            else
                log_info "libxtables12 版本 $current_version 已符合要求，跳过"
            fi

            apt install -y uidmap fuse-overlayfs dbus-user-session slirp4netns iptables
            ;;
        "ubuntu24")
            log_info "为 Ubuntu 24 安装包..."
            apt install -y uidmap fuse-overlayfs dbus-user-session slirp4netns iptables
            ;;
        *)
            log_warn "为其他系统安装基础包..."
            apt install -y uidmap fuse-overlayfs dbus-user-session slirp4netns iptables
            ;;
    esac
}

# 执行主函数
main